#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    : /processing.py
@Time    : 2021-05-20 10:14:36
@Author  : Gray Snail
@Version : 1.0
@Contact : shtao2011@sina.com
@License : Copyright (c) 2021 Gray Snail
@Desc    : 多线程学习

multiprocessing.Process 基类
    p.join([timeout])：主线程等待p终止，也可以理解为回收计算机资源；会 blocking 主进程，直到子进程结束。
        值得注意的是，主线程从始至终处于等待的状态，而p是处于运行的状态，join只能作用于start的进程，而不能作用于run的进程。

    守护进程(daemon=True)不能创建子进程；守护进程中通常不需要等待子进程退出，即无 p.join()语句。
        守护进程主进程结束时强制结束，daemon=False时主进程会等待子进程结束后才结束

    Lock锁，多进程之间可以使用，避免资源访问冲突
        mutex = Lock()
        mutex.acquire()
        mutex.release()

'''


from multiprocessing import Process

import time


# 1. 定义多进程的target函数
def fun(name):
    print(f'{name} 正在执行。。。')
    time.sleep(1)
    print(f'{name} 执行完毕。。。')


# 2. 继承Process类并重写 run 方法
class MyProcess(Process):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        name = self.name
        print(f'{name} 正在执行。。。')
        time.sleep(1)
        print(f'{name} 执行完毕。。。')


# 3. 验证deamon进程
def long_time(name):
    print(f'{name} 正在执行。。。')
    time.sleep(10)
    print(f'{name} 执行完毕。。。')


if __name__ == '__main__':
    p1 = Process(target=fun, args=('Chancey',))
    p2 = Process(target=long_time, args=('Jane',), daemon=True, name='jane')
    p3 = MyProcess('Mary')
    p4 = MyProcess('Arry')

    p1.start()
    p2.start()
    p3.start()
    p4.start()

    # p1.join()  # 等待子进程结束
    print("主线程启动")
    print(p2.pid)